/**
 * 判断url是否是http或https
 */
 export function isHttp(url) {
  return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
}

/**
 * 判断path是否为外链
 */
 export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * 校验 - url
 */
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * 校验 - 小写字母
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * 校验 - 大写字母
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * 校验 - 有效字母
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * 校验邮箱地址
 */
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}

/**
 * 是不是字符串
 */
export function isString(str) {
  if (typeof str === 'string' || str instanceof String) {
    return true
  }
  return false
}

/**
 * 是否数组
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}


/**
 * 是否为空，针对 数组、对象、字符串、new Map()、new Set()、null、undefined 进行判断，null、undefined 直接返回 true，也就是直接等于空
 */
export function isAllEmpty(value){
  if (value === null || value === undefined) {
    return true;
  }

  if (Array.isArray(value) || typeof value === 'string') {
    return value.length === 0;
  }

  if (value instanceof Map || value instanceof Set) {
    return value.size === 0;
  }

  if (typeof value === 'object') {
    return Object.keys(value).length === 0;
  }

  return false;
}

/**
 * 判断两个对象是否全等 (所有可枚举属性值一致)
 */
export function isEqual(obj1, obj2) {
  // 如果其中没有对象
  if (!isObject(obj1) || !isObject(obj2)) {
    //值类型
    return obj1 === obj2
  }
  // 如果特意传的就是两个指向同一地址的对象
  if (obj1 === obj2) {
    return true
  }
  // 两个都是对象或者数组，而且不相等
  // 拿到对象key
  let obj1Keys = Object.keys(obj1)
  let obj2Keys = Object.keys(obj2)
  // 先判断长度就可以过滤一些
  if (obj1Keys.length !== obj2Keys.length) {
    return false
  }
  // 以obj1为基准 和 obj2 一次递归比较
  for (let key in obj1) {
    // 递归比较当前每一项
    const res = isEqual(obj1[key], obj2[key])
    // 如果碰到一个不一样的就返回 false
    if (!res) {
      // 跳出for循环
      return false
    }
  }
  // 否则全相等
  return true
}

/**
 * 是否是对象
 */
export function isObject(value) {
  const type = typeof value
  if(type === 'function') {
    return true
  }
  return type === 'object' && value != null;

}

/**
 * 是否布尔值
 */
export const isBoolean = val => 'boolean' === typeof val;

export const isNumber = val => {
  return typeof val === 'number' && isFinite(val);
}

// 验证是否为blob格式
export function isBlob(data) {
  return data.type !== 'application/json'
}


